/**
 * 引入全局状态管理
 */
import {defineStore} from 'pinia'
import {ref} from 'vue'

//引入请求登录的api方法
import {login, logout} from '@/api/login.js'
//引入保存token的方法
import { getToken, setToken } from '@/utils/auth'
import { getInfo } from '@/api/user'


/**
 * defineStore 用于定义一个全局状态管理模块的函数
 * defineStore('定义一个不重复并且唯一的字符串',这里定义一个方法，需要返回使用到的一些方法或者是属性)
 */
/**
 * 用户全局状态管理
 */
const useUserStore = defineStore("user",function(){
	//定义用户数据属性
	const user  = ref(uni.getStorageSync('user') || {})
	//定义用户访问唯一标识
	const token = ref(getToken())
	//定义用户积分
	const userPoints = ref(parseFloat(uni.getStorageSync('userPoints') || '0'))
	
	/**
	 * 登录方法
	 * @param {Object} loginForm 账号密码
	 */
	function Login(loginForm) {
		//创建一个异步,第一个方法是成功的回调，第二个方法是失败的回调
		return new Promise((resolve,reject) =>{
			const username = loginForm.username
			const password  =loginForm.password
			login(username,password).then((info) =>{
				//请求成功返回用户数据
				user.value = info
				info.avatarUrl = info.avatarUrl ? info.avatarUrl : '/static/logo.png'
				//获取用户访问的标识
				token.value = info.token
				//将用户访问的标识存储到本地缓存中
				setToken(token.value)
				uni.setStorageSync('user',info)
				//调用成功的回调
				resolve()
			}).catch((error) =>{
				reject(error)
			})
		})
	}
	
	// 退出登录后端的方法
	function Logout() {
		//创建一个异步,第一个方法是成功的回调，第二个方法是失败的回调
		return new Promise((resolve,reject) =>{
			logout().then(() =>{
				resolve()
			}).catch((error) =>{
				reject(error)
			})
		})
	}
	
	//获取用户数据
	async function getUserInfo() {
		const info =  await getInfo()
		user.value = info
		uni.setStorageSync('user',info)
	}
	
	//这里返回一个对象
	return {
		user,
		Login,
		Logout,
		getUserInfo,
		userPoints
	}
})



//导出用户全局状态管理
export {useUserStore}